;判断一个数是不是偶数, 是的话返回true
(define (even? x) (= (remainder x 2) 0))

;基于矩阵变换的迭代求法
(define (fib-iter a b p q count)
    (cond ((= count 0) b)
          ((even? count)
           (fib-iter a
                     b
                     (+ (* p p) (* q q))  ; p' = p^2 + q^2
                     (+ (* 2 (* p q)) (* q q))  ; q' = 2pq + q^2
                     (/ count 2)))
          (else (fib-iter (+ (* b q) (* a q) (* a p))
                          (+ (* b p) (* a q))
                          p
                          q
                          (- count 1)))))

(define (fib n)
    (fib-iter 1 0 0 1 n))